// 对axios做二次封装，方便请求接口
import axios from 'axios'
// 导入进度条插件
import NProgress from 'nprogress'
// 导入进度条样式
import 'nprogress/nprogress.css'

// 导出基准地址，原因：其他地方不是通过axios发请求的地方用上基准地址

// 我的阿里云服务器地址
export const baseURL = 'http://47.110.90.23:8888/api/private/v1'
export const serverURL = 'http://47.110.90.23:8888'

// 腾讯云(window)
// export const baseURL = 'http://121.4.27.141:8888/api/private/v1'
// export const serverURL = 'http://121.4.27.141:8888'

const request = axios.create({
    // axios 的一些配置，baseURL  timeout
    baseURL,
    // 请求的超时时间
    timeout: 5000
})

// 添加请求拦截器
request.interceptors.request.use(config => {
        // 当进入request拦截器前，表示发送了请求，我们就开启进度条
        NProgress.start()

        // 在发送请求之前做些什么,比如需要登录才能发起的请求，可以在请求头中添加token需要进行登录校验的接口，在请求时都需要在请求头中携带token，去后端api中做token校验
        const token = window.sessionStorage.getItem('token')
        if (config.url !== '/login' && token) {
            config.headers.Authorization = token
        }
        return config
    },
    error => {
        // 对请求错误做些什么,通过Promise.reject()返回，那么将来在使用时可以使用catch来捕获异常
        return Promise.reject(error)
    })

// 添加响应拦截器
request.interceptors.response.use(response => {
        // 响应状态码2xx 范围内的状态码都会触发该函数。
        // 当进入response拦截器，表示请求已经结束，我们就结束进度条
        NProgress.done()
        return response.data
    },
    error => {
        // 超出 2xx 范围的状态码都会触发该函数。
        // 对响应错误做点什么
        // 通过Promise.reject() 返回， 那么将来在使用时可以使用catch来捕获异常
        return Promise.reject(error)
    })

// 请求的工具类
// url：请求的地址；method:请求方式；submitData: 请求的数据，必须是一个对象
export default (url, method, submitData) => {
    // 负责发请求：请求地址，请求方式，提交的数据
    return request({
        url,
        method,
        [method.toLowerCase() === 'get' ? 'params' : 'data']: submitData
    })
}